using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using System.Data;
using RC.CodigoBarras.Utiles;
using System.Web.Caching;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;

namespace RC.ControlAcceso.ObjetosNegocio
{
    public class CA2Empresa
    {
        #region CACHE
        private static Cache _cache;
        /// <summary>
        /// Cache para todos los objetos de legajo
        /// </summary>
        private static Cache CacheCA
        {
            get
            {
                if (_cache == null)
                    _cache = System.Web.HttpRuntime.Cache;
                return _cache;
            }
            set
            {
                _cache = value;
            }
        }
        #endregion

        #region Variables
        private int _idEmpresa;
        private string _nombre;
        private string _cuit;
        private string _direccion;
        private string _localidad;
        private string _provincia;
        private string _pais;
        private string _telefono;
        private string _fax;
        private bool _estaActivo;

        // objeto de base de datos
        CAEmpresaBD mEmpresaBD;

        #endregion

        #region Propiedades

        public int IdEmpresa
        {
            get { return _idEmpresa; }
            set { _idEmpresa = value; }
        }
        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }
        public string Cuit
        {
            get { return _cuit; }
            set { _cuit = value; }
        }
        public string Direccion
        {
            get { return _direccion; }
            set { _direccion = value; }
        }
        public string Localidad
        {
            get { return _localidad; }
            set { _localidad = value; }
        }
        public string Provincia
        {
            get { return _provincia; }
            set { _provincia = value; }
        }
        public string Pais
        {
            get { return _pais; }
            set { _pais = value; }
        }
        public string Telefono
        {
            get { return _telefono; }
            set { _telefono = value; }
        }
        public string Fax
        {
            get { return _fax; }
            set { _fax = value; }
        }
        public bool EstaActivo
        {
            get { return _estaActivo; }
            set { _estaActivo = value; }
        }
        #endregion

        #region Constructores
        public CA2Empresa()
        {
            _idEmpresa = -1;
            Nombre = "";
            Cuit = "";
            Direccion = "";
            Localidad = "";
            Provincia = "";
            Pais = "";
            Telefono = "";
            Fax = "";
            EstaActivo = true;
        }
        #endregion

        #region Funciones
        
        
        /// <summary>
        /// Agrega un Empresa.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        //public void Insertar()
        //{
        //    ValidarParaInsertar();
        //    CA2Empresa.Insertar(Nombre, Cuit, Direccion, Localidad, Provincia, Pais, Telefono, Fax, EstaActivo);
        //}
        //private void ValidarParaInsertar()
        //{
        //    if ((this.Nombre == string.Empty)
        //        || (this.Nombre == ""))
        //        throw new Exception("Debe ingresar un nombre.");
        //}
        ///// <summary>
        ///// Actualiza el objeto.
        ///// </summary>
        ///// <returns>No devuelve nada.</returns>
        //public void Actualizar()
        //{
        //    ValidarParaInsertar();
        //    CA2Empresa.Actualizar(Nombre, Cuit, Direccion, Localidad, Provincia, Pais, Telefono, Fax, EstaActivo, IdEmpresa);
        //}
        /// <summary>
        /// Asigna los objetos de la base de datos a el objeto de nengocio
        /// </summary>
        private void AsignarBDaON()
        {
            IdEmpresa = mEmpresaBD.IdEmpresa;
            Nombre = mEmpresaBD.Nombre;
            Cuit = mEmpresaBD.Cuit;
            Direccion = mEmpresaBD.Direccion;
            Localidad = mEmpresaBD.Localidad;
            Provincia = mEmpresaBD.Provincia;
            Pais = mEmpresaBD.Pais;
            Telefono = mEmpresaBD.Telefono;
            Fax = mEmpresaBD.Fax;
            EstaActivo = mEmpresaBD.EstaActivo;
        }
        /// <summary>
        /// Asigna los objetos de negocio a base de datos
        /// </summary>
        private void AsignarONaBD()
        {
            if (mEmpresaBD == null)
                mEmpresaBD = new CAEmpresaBD();
            mEmpresaBD.IdEmpresa = IdEmpresa;
            mEmpresaBD.Nombre = Nombre;
            mEmpresaBD.Cuit = Cuit;
            mEmpresaBD.Direccion = Direccion;
            mEmpresaBD.Localidad = Localidad;
            mEmpresaBD.Provincia = Provincia;
            mEmpresaBD.Pais = Pais;
            mEmpresaBD.Telefono = Telefono;
            mEmpresaBD.Fax = Fax;
            mEmpresaBD.EstaActivo = EstaActivo;
        }
        public CA2Empresa AsignarRowAEmpresa(DataRow pRow)
        {
            CA2Empresa _empresa = new CA2Empresa();


            _empresa.IdEmpresa = int.Parse(pRow["IdEmpresa"].ToString());
            _empresa.Nombre = pRow["Nombre"].ToString();
            _empresa.Cuit = pRow["CUIT"].ToString();
            _empresa.Direccion = pRow["Direccion"].ToString();
            _empresa.Localidad = pRow["Localidad"].ToString();
            _empresa.Provincia = pRow["Provincia"].ToString();
            _empresa.Pais = pRow["Pais"].ToString();
            _empresa.Telefono = pRow["Telefono"].ToString();
            _empresa.Fax = pRow["Fax"].ToString();

            try { _empresa.EstaActivo = bool.Parse(pRow["EstaActivo"].ToString()); }
            catch { _empresa.EstaActivo = true; }

            return _empresa;
        }
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static CAEmpresaTableAdapter _empresaAD;
        protected static CAEmpresaTableAdapter Adaptador
        {
            get
            {
                if (_empresaAD == null)
                    _empresaAD = new CAEmpresaTableAdapter();

                return _empresaAD;
            }
        }
        public static CA2Empresa ObtenerPorID(int pIDidEmpresa)
        {
            /////////////////////////
            // Obtengo objeto desde el cache
            CA2Empresa _empresa = (CA2Empresa)CacheCA["Empresa" + pIDidEmpresa.ToString()]; // trato de obtenerlo del cache
            if (_empresa != null)
                return _empresa;
            // Fin obtener de cache
            ///////////////////////////////////

            ///////////////////////////////////////////////
            // No esta en el cache lo tengo que traer de la base de datos
            GestionHoraria.CAEmpresaDataTable _dt;

            // obtengo el elemento por ID            
            _dt = Adaptador.ObtenerPorId(pIDidEmpresa);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
            {
                _empresa = AsignarRowAObjeto((GestionHoraria.CAEmpresaRow)_dt.Rows[0]);

                // Asigno el nuevo objeto al cache.
                CacheCA.Insert("Empresa" + _empresa.IdEmpresa.ToString(), _empresa, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(1, 0, 0));
            }

            return _empresa;
        }
        protected static CA2Empresa AsignarRowAObjeto(GestionHoraria.CAEmpresaRow pRow)
        {
            CA2Empresa _empresa = null;
            if (pRow != null)
            {
                _empresa = new CA2Empresa();
                _empresa.IdEmpresa = pRow.IdEmpresa;
                try { _empresa.Nombre = pRow.Nombre; }
                catch { _empresa.Nombre = ""; }
                try { _empresa.Cuit = pRow.Cuit; }
                catch { _empresa.Cuit = ""; }
                try { _empresa.Direccion = pRow.Direccion; }
                catch { _empresa.Direccion = ""; }
                try { _empresa.Localidad = pRow.Localidad; }
                catch { _empresa.Localidad = ""; }
                try { _empresa.Provincia = pRow.Provincia; }
                catch { _empresa.Provincia = ""; }
                try { _empresa.Pais = pRow.Pais; }
                catch { _empresa.Pais = ""; }
                try { _empresa.Telefono = pRow.Telefono; }
                catch { _empresa.Telefono = ""; }
                try { _empresa.Fax = pRow.Fax; }
                catch { _empresa.Fax = ""; }
                try { _empresa.EstaActivo = pRow.EstaActivo; }
                catch { _empresa.EstaActivo = true; }
            }
            return _empresa;
        }
        public static int Insertar(string pNombre,string  pCuit,string  pDireccion,string  pLocalidad,string  pProvincia,string  pPais,string  pTelefono,string  pFax,bool pEstaActivo)
        {
            return int.Parse(Adaptador.Insertar(pNombre, pCuit, pDireccion, pLocalidad, pProvincia, pPais, pTelefono, pFax, pEstaActivo).ToString());
        }
        public static bool Actualizar(string pNombre, string pCuit, string pDireccion, string pLocalidad, string pProvincia, string pPais, string pTelefono, string pFax, bool pEstaActivo, int pIdEmpresa)
        {
            if (0 < Adaptador.Actualizar(pNombre, pCuit, pDireccion, pLocalidad, pProvincia, pPais, pTelefono, pFax, pEstaActivo, pIdEmpresa))
            {
                //Quito el objeto del cache para que no se tome otra vez con los datos viejos.
                CacheCA.Remove("Empresa" + pIdEmpresa.ToString());
                return true;
            }
            else
                return false;
        }
        protected static CA2EmpresaColeccion AsignarEmpresaTableAdapterAEmpresaColeccion(GestionHoraria.CAEmpresaDataTable pDataTable)
        {
            CA2EmpresaColeccion _empresas = new CA2EmpresaColeccion();
            CA2Empresa _empresa;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (GestionHoraria.CAEmpresaRow _row in pDataTable.Rows)
                {
                    _empresa = AsignarRowAObjeto(_row);
                    if (_empresa != null)
                        _empresas.Add(_empresa);
                }
            }
            return _empresas;
        }
        public static CA2EmpresaColeccion ObtenerTodos()
        {
            return AsignarEmpresaTableAdapterAEmpresaColeccion(Adaptador.ObtenerTodos());
        }

        /// <summary>
        /// Obtiene todas las empresas que contengan el valor especificado.
        /// Si el parametro es "" se obtienen todas las empresas
        /// </summary>
        /// <param name="pValor"></param>
        /// <returns></returns>
        public static CA2EmpresaColeccion ObtenerPorValor(string pValor)
        {
            if((pValor == null) // si esta vacio le devuelvo todas las empresas
                || (pValor == ""))
                return AsignarEmpresaTableAdapterAEmpresaColeccion(Adaptador.ObtenerTodos());

            return AsignarEmpresaTableAdapterAEmpresaColeccion(Adaptador.ObtenerPorValor(pValor));
        }
        #endregion

        public static void Actualizar(CA2Empresa _empresa)
        {
            Actualizar(_empresa.Nombre, _empresa.Cuit, _empresa.Direccion, _empresa.Localidad, _empresa.Provincia, _empresa.Pais, _empresa.Telefono, _empresa.Fax, _empresa.EstaActivo, _empresa.IdEmpresa);
        }
        public static int Insertar(CA2Empresa _empresa)
        {
            return CA2Empresa.Insertar(_empresa.Nombre, _empresa.Cuit, _empresa.Direccion, _empresa.Localidad, _empresa.Provincia, _empresa.Pais, _empresa.Telefono, _empresa.Fax, _empresa.EstaActivo);
        }
        public static void Eliminar(CA2Empresa _empresa)
        {
            _empresa = CA2Empresa.ObtenerPorID(_empresa.IdEmpresa);
            _empresa.EstaActivo = false;
            Actualizar(_empresa);
        }
    }
    public class CA2EmpresaColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2Empresa pEmpresa)
        {
            this.List.Add(pEmpresa);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public CA2Empresa this[int index]
        {
            get { return ((CA2Empresa)(this.List[index])); }
            set { this.List[index] = value; }
        }
        /// <summary>
        /// Devuelve el objeto Empresa que corresponde al nombre especificado.
        /// Si la Empresa no existe, devuel Null.
        /// </summary>
        /// <param name="pNombreEmpresa"></param>
        /// <returns></returns>
        public CA2Empresa ObtenerEmpresaPorNombre(string pNombreEmpresa)
        {
            foreach (CA2Empresa _empresa in this)
                try
                {
                    if (_empresa.Nombre.ToUpper() == pNombreEmpresa.ToUpper())
                        return _empresa;
                }
                catch { }

            // si no lo encuentra devuelve vacio
            return null;
        }
        /// <summary>
        /// Obtiene todas las Empresas
        /// </summary>
        public CA2EmpresaColeccion ObtenerTodasLasEmpresas()
        {
            CAEmpresaBD _empresa = new CAEmpresaBD();
            DataSet _empresasDS = _empresa.ObtenerTodos();
            return AsignarDatasetAColeccion(_empresasDS);
        }
        /// <summary>
        /// Asigna los valores del dataset a el objeto coleccion.
        /// </summary>
        /// <param name="pDSLegajos"></param>
        /// <returns></returns>
        private CA2EmpresaColeccion AsignarDatasetAColeccion(DataSet pEmpresasDS)
        {
            if ((pEmpresasDS == null) || (pEmpresasDS.Tables[0].Rows.Count == 0))
                return null;

            CA2EmpresaColeccion _resultado = new CA2EmpresaColeccion();
            CA2Empresa _empresa = new CA2Empresa(); //lo creo aca por que tengo que usar solamente un metodo que tiene 

            // recorro todas las filas y cargo los objetos
            foreach (DataRow _row in pEmpresasDS.Tables[0].Rows)
            {
                // asigno los valores a el objeto y el objeto a la coleccion
                _resultado.Add(_empresa.AsignarRowAEmpresa(_row));
            }

            return _resultado;

        }
        /// <summary>
        /// Obtiene todas las Empresas activas utilizables
        /// </summary>
        /// <returns></returns>
        private CA2EmpresaColeccion ObtenerEmpresasActivas()
        {
            CA2EmpresaColeccion _resultado = new CA2EmpresaColeccion();
            foreach (CA2Empresa _empresa in this)
                if (_empresa.EstaActivo == true)
                    _resultado.Add(_empresa);

            return _resultado;
        }
    }
}